
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.brain.cont.view.mbean;

import com.brain.conf.dto.TerceroDireccionDto;
import com.brain.conf.dto.TerceroDto;
import com.brain.cont.dto.AsientoDetaDto;
import com.brain.cont.dto.AsientoDto;
import com.brain.cont.dto.PlanContableDetaDto;
import com.brain.cont.manager.AsientoDetaManager;
import com.brain.cont.manager.AsientoManager;
import com.brain.cont.manager.AsientoOperacionDetaManager;
import com.brain.cont.manager.PlanContableDetaManager;
import com.brain.cont.view.util.ConstantesCont;
import com.brain.core.common.UtilCore;
import com.brain.core.dto.ParametroDto;
import com.brain.core.exception.DAOException;
import com.brain.core.manager.BitacoraManager;
import com.brain.core.manager.ParametroManager;
import com.brain.core.view.mbean.*;
import com.brain.core.manager.RecursosManager;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import com.brain.core.view.util.ConstantesCore;
import java.math.BigDecimal;

import javax.annotation.Resource;
import javax.faces.model.SelectItem;
import org.apache.log4j.Logger;
import org.primefaces.context.RequestContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

/**
 *
 * @author J. Verde
 */
@Controller("asientoMBean")
@Scope("session")
public class AsientoMBean extends GenericMBean implements Serializable {

    private static Logger logger = Logger.getLogger(AsientoMBean.class);
    @Resource
    private RecursosManager recursosManager;
    @Resource
    private AsientoManager manager;
    
    @Resource
    private AsientoDetaManager managerDeta;
    
    @Resource
    private BitacoraManager managerBitacora;
    
    @Resource
    private ParametroManager managerParametro;
   
    @Resource
    private AsientoDetaManager asientoDetaManager;
    
    @Resource
    private AsientoOperacionDetaManager managerAsientoOperacionDeta;
    
    @Resource
    PlanContableDetaManager planContableDetaManager;
    
    private List<AsientoDto> lista;
    private AsientoDto dto;
    private AsientoDetaDto detaDto;
    private AsientoDto dtoFiltro;
    private String keyTitulo = "key.asiento.titulo";
    private String keyTituloAsientoDeta = "key.asiento.deta.titulo";
    
    private List<ParametroDto> siAnos;
    private List<ParametroDto> siMeses;
    private List<ParametroDto> siOrigenes;
    private List<ParametroDto> siEstados;
    
    private List<ParametroDto> siAnosFiltro;
    private List<ParametroDto> siMesesFiltro;
    private List<ParametroDto> siOrigenesFiltro;
    private List<ParametroDto> siEstadosFiltro;
    private SelectItem[] siTipos;
    
    
    //    
    @Autowired
    private ApplicationMBean applicationMBean;
    @Autowired
    private SessionMBean sessionMBean;

    public AsientoMBean() {
        this.dtoFiltro = null;
        this.dto = null;
    }

    public String iniciar() {
        this.dtoFiltro = new AsientoDto();        
        this.dtoFiltro.setAnoDto(recursosManager.obtenerParametroPorId(ConstantesCore.Parametro.TODOS));
        this.dtoFiltro.setMesDto(recursosManager.obtenerParametroPorId(ConstantesCore.Parametro.TODOS));
        this.dtoFiltro.setOrigenDto(recursosManager.obtenerParametroPorId(ConstantesCore.Parametro.TODOS)); 
        this.dtoFiltro.setEstadoDto(recursosManager.obtenerParametroPorId(ConstantesCore.Parametro.TODOS)); 
        this.dtoFiltro.setTerceroDto(new TerceroDto());        
        
        this.lista = new ArrayList<AsientoDto>();
        return manager.getUrlLista();
    }

    public void handleTerceroChange() {
        RequestContext context = RequestContext.getCurrentInstance();
        boolean resultado = true;
        context.addCallbackParam("CallbackParam", resultado);
    }
    public String nuevo() {
        sessionMBean.setAccion(ConstantesCont.Formulario.NUEVO);
        sessionMBean.setTitulo(recursosManager.construirTitulo(keyTitulo, sessionMBean.getAccion()));
        
        this.dto = new AsientoDto();     
        this.dto.setNumeroAsiento(manager.obtenerNumeroAsiento(sessionMBean.getOrganizacionDto(),sessionMBean.getAnoContableDto())); //Num Asiento Referencial
        this.dto.setTerceroDto(new TerceroDto());
        try {
            this.dto.setAnoDto(managerParametro.obtenerPorCatalogoYValorEntero(ConstantesCont.CatalogoParametro.CONTA_ANIOS_TRABAJO, Long.valueOf(UtilCore.Fecha.obtenerAnioActual())));
        } catch (DAOException ex) {
            this.dto.setAnoDto(new ParametroDto());
        }
        try {
            this.dto.setMesDto(managerParametro.obtenerPorCatalogoYValorEntero(ConstantesCont.CatalogoParametro.CONTA_MESES_TRABAJO, Long.valueOf(UtilCore.Fecha.obtenerMesActual())));
        } catch (DAOException ex) {
            this.dto.setMesDto(new ParametroDto());
        }
        
        this.dto.setOrigenDto(new ParametroDto());
        this.dto.setListaDetalles(new ArrayList<AsientoDetaDto>());
        return manager.getUrlPrincipal();
    }

    public void nuevoAsientoDeta() {
        sessionMBean.setAccion(ConstantesCont.Formulario.NUEVO);
        sessionMBean.setTitulo(recursosManager.construirTitulo(keyTituloAsientoDeta, sessionMBean.getAccion()));
        this.detaDto = new AsientoDetaDto();
        this.detaDto.setAsientoDto(dto);    
        this.detaDto.setTipoMovimiento("D");
        this.detaDto.setCuentaDto(new PlanContableDetaDto());
        this.detaDto.setLinea(Long.valueOf(this.detaDto.getAsientoDto().getListaDetalles().size()+1));
    }

    
    
    public String nuevoIniciado() {
        AsientoDto a = this.dto;
        nuevo();
        this.dto.setId(null);        
        this.dto.setOrigenDto(a.getOrigenDto());
        this.dto.setOrganizacionDto(a.getOrganizacionDto());
        this.dto.setAnoDto(a.getAnoDto());
        this.dto.setMesDto(a.getMesDto());
        this.dto.setTerceroDto(a.getTerceroDto());
        this.dto.setGlosa(a.getGlosa());
        this.dto.setListaDetalles(new ArrayList<AsientoDetaDto>());        
        
        for (AsientoDetaDto d : a.getListaDetalles()) {
            d.setId(null);
            d.setAsientoDto(this.dto);            
            this.dto.getListaDetalles().add(d);
        }
                
        return manager.getUrlPrincipal();
    }
    
    public String editar() {
        sessionMBean.setAccion(ConstantesCont.Formulario.EDITAR);
        sessionMBean.setTitulo(recursosManager.construirTitulo(keyTitulo, sessionMBean.getAccion()));
        return manager.getUrlPrincipal();
    }

    public void eliminarAsientoDeta() throws DAOException {
        AsientoDetaDto d = detaDto;
        
        for (AsientoDetaDto x : this.dto.getListaDetalles()) {
            if (x.getLinea()>d.getLinea()){
                x.setLinea(x.getLinea()-1);
            }
        }        
        managerDeta.editarMuchos(this.dto.getListaDetalles());
        
        managerDeta.eliminar(detaDto);
        manager.actualizarTotalesAsiento(this.dto.getId());
        this.dto = this.manager.obtenerPorId(this.dto.getId());
    }
    
    public List<PlanContableDetaDto> autoCompletarCuentaContable(String query) {
        List<PlanContableDetaDto> results = null;
        try {
            results = planContableDetaManager.autoCompletarCuenta(query);
        } catch (DAOException ex) {
            logger.error(ex);
            results = new ArrayList<PlanContableDetaDto>();
        }
        return results;
    }
    
    public void editarAsientoDeta() {
        sessionMBean.setAccion(ConstantesCont.Formulario.EDITAR);
        sessionMBean.setTitulo(recursosManager.construirTitulo(keyTituloAsientoDeta, sessionMBean.getAccion()));
    }

    public void verAsientoDeta() {
        sessionMBean.setAccion(ConstantesCont.Formulario.VER);
        sessionMBean.setTitulo(recursosManager.construirTitulo(keyTituloAsientoDeta, sessionMBean.getAccion()));
    }

    public String ver() {
        sessionMBean.setAccion(ConstantesCont.Formulario.VER);
        sessionMBean.setTitulo(recursosManager.construirTitulo(keyTitulo, sessionMBean.getAccion()));
        return manager.getUrlPrincipal();
    }

    public void guardar() {
        try {
            if (manager.guardar(dto) != null) {
                this.dto = this.manager.obtenerPorId(this.dto.getId());
                sessionMBean.setAccion(ConstantesCont.Formulario.EDITAR);
            }
        } catch (DAOException ex) {
            recursosManager.showError(ex.getMessage());
        }
    }

    public boolean guardarAsientoDeta() {
        try {
            if (managerDeta.guardar(detaDto) != null) {
                this.dto = this.manager.obtenerPorId(this.dto.getId());
                sessionMBean.setAccion(ConstantesCont.Formulario.EDITAR);
            }
        } catch (Exception ex) {
            showError(ex.getMessage());
        }
        return false;
    }
    
    public boolean guardarAsientoDeta(AsientoDetaDto ad) {
        editarAsientoDeta();
        System.out.println(ad.getMontoDebe());
        this.detaDto = ad;        
        return guardarAsientoDeta();
    }
    
    public String verBitacora() {
        managerBitacora.cargarBitacoraEntidad(manager.getIdEntidad(), this.dto.getId());
        return null;
    }
    
    public void buscar() {
        try {
            lista = manager.buscar(dtoFiltro);
        } catch (DAOException ex) {
            logger.error(ex);
        }
    }

    public String retroceder() {
        sessionMBean.setAccion(ConstantesCont.Formulario.LISTA);
        sessionMBean().setTitulo(recursosManager.construirTitulo(keyTitulo, sessionMBean().getAccion()));
        return manager.getUrlLista();
    }

    public static Logger getLogger() {
        return logger;
    }

    public static void setLogger(Logger logger) {
        AsientoMBean.logger = logger;
    }

    public RecursosManager getRecursosManager() {
        return recursosManager;
    }

    public void setRecursosManager(RecursosManager recursosManager) {
        this.recursosManager = recursosManager;
    }

    public AsientoManager getManager() {
        return manager;
    }

    public void setManager(AsientoManager manager) {
        this.manager = manager;
    }

    public List<AsientoDto> getLista() {
        return lista;
    }

    public void setLista(List<AsientoDto> lista) {
        this.lista = lista;
    }

    public AsientoDto getDto() {
        return dto;
    }

    public void setDto(AsientoDto dto) {
        this.dto = dto;
    }

    public AsientoDto getDtoFiltro() {
        return dtoFiltro;
    }

    public void setDtoFiltro(AsientoDto dtoFiltro) {
        this.dtoFiltro = dtoFiltro;
    }

    public String getKeyTitulo() {
        return keyTitulo;
    }

    public void setKeyTitulo(String keyTitulo) {
        this.keyTitulo = keyTitulo;
    }

    public ApplicationMBean getApplicationMBean() {
        return applicationMBean;
    }

    public void setApplicationMBean(ApplicationMBean applicationMBean) {
        this.applicationMBean = applicationMBean;
    }

    public SessionMBean getSessionMBean() {
        return sessionMBean;
    }

    public void setSessionMBean(SessionMBean sessionMBean) {
        this.sessionMBean = sessionMBean;
    }

    public AsientoDetaManager getManagerDeta() {
        return managerDeta;
    }

    public void setManagerDeta(AsientoDetaManager managerDeta) {
        this.managerDeta = managerDeta;
    }

    public BitacoraManager getManagerBitacora() {
        return managerBitacora;
    }

    public void setManagerBitacora(BitacoraManager managerBitacora) {
        this.managerBitacora = managerBitacora;
    }

    public AsientoDetaManager getAsientoDetaManager() {
        return asientoDetaManager;
    }

    public void setAsientoDetaManager(AsientoDetaManager asientoDetaManager) {
        this.asientoDetaManager = asientoDetaManager;
    }

    public AsientoDetaDto getDetaDto() {
        return detaDto;
    }

    public void setDetaDto(AsientoDetaDto detaDto) {
        this.detaDto = detaDto;
    }

    public String getKeyTituloAsientoDeta() {
        return keyTituloAsientoDeta;
    }

    public void setKeyTituloAsientoDeta(String keyTituloAsientoDeta) {
        this.keyTituloAsientoDeta = keyTituloAsientoDeta;
    }

    public List<ParametroDto> getSiAnos() {
        return this.recursosManager.obtenerParametrosActivosPorCatalogoSistema(ConstantesCont.CatalogoParametro.CONTA_ANIOS_TRABAJO);
    }

    public void setSiAnos(List<ParametroDto> siAnos) {
        this.siAnos = siAnos;
    }

    public List<ParametroDto> getSiMeses() {
        return this.recursosManager.obtenerParametrosActivosPorCatalogoSistema(ConstantesCont.CatalogoParametro.CONTA_MESES_TRABAJO);
    }

    public void setSiMeses(List<ParametroDto> siMeses) {
        this.siMeses = siMeses;
    }

    public List<ParametroDto> getSiOrigenes() {
        return this.recursosManager.obtenerParametrosActivosPorCatalogoSistema(ConstantesCont.CatalogoParametro.CONTA_ORIGENES);
    }

    public void setSiOrigenes(List<ParametroDto> siOrigenes) {
        this.siOrigenes = siOrigenes;
    }

    public List<ParametroDto> getSiAnosFiltro() {
        return this.recursosManager.obtenerParametrosActivosPorCatalogoSistemaAdd(ConstantesCont.CatalogoParametro.CONTA_ANIOS_TRABAJO, com.brain.core.view.util.ConstantesCore.Parametro.TODOS);
    }

    public void setSiAnosFiltro(List<ParametroDto> siAnosFiltro) {
        this.siAnosFiltro = siAnosFiltro;
    }

    public List<ParametroDto> getSiMesesFiltro() {
        return this.recursosManager.obtenerParametrosActivosPorCatalogoSistemaAdd(ConstantesCont.CatalogoParametro.CONTA_MESES_TRABAJO, com.brain.core.view.util.ConstantesCore.Parametro.TODOS);
    }

    public void setSiMesesFiltro(List<ParametroDto> siMesesFiltro) {
        this.siMesesFiltro = siMesesFiltro;
    }

    public List<ParametroDto> getSiOrigenesFiltro() {
       return this.recursosManager.obtenerParametrosActivosPorCatalogoSistemaAdd(ConstantesCont.CatalogoParametro.CONTA_ORIGENES, com.brain.core.view.util.ConstantesCore.Parametro.TODOS);
    }

    public void setSiOrigenesFiltro(List<ParametroDto> siOrigenesFiltro) {
        this.siOrigenesFiltro = siOrigenesFiltro;
    }
    public SelectItem[] getSiTipos() {
        return managerAsientoOperacionDeta.siTipos();
    }

    public void setSiTipos(SelectItem[] siTipos) {
        this.siTipos = siTipos;
    }

    public ParametroManager getManagerParametro() {
        return managerParametro;
    }

    public void setManagerParametro(ParametroManager managerParametro) {
        this.managerParametro = managerParametro;
    }

    public AsientoOperacionDetaManager getManagerAsientoOperacionDeta() {
        return managerAsientoOperacionDeta;
    }

    public void setManagerAsientoOperacionDeta(AsientoOperacionDetaManager managerAsientoOperacionDeta) {
        this.managerAsientoOperacionDeta = managerAsientoOperacionDeta;
    }

    public PlanContableDetaManager getPlanContableDetaManager() {
        return planContableDetaManager;
    }

    public void setPlanContableDetaManager(PlanContableDetaManager planContableDetaManager) {
        this.planContableDetaManager = planContableDetaManager;
    }

   

    public List<ParametroDto> getSiEstados() {
        return this.recursosManager.obtenerParametrosActivosPorCatalogoSistema(ConstantesCont.CatalogoParametro.CONTA_ESTADOS);
    }

    public void setSiEstados(List<ParametroDto> siEstados) {
        this.siEstados = siEstados;
    }

    public List<ParametroDto> getSiEstadosFiltro() {
        return this.recursosManager.obtenerParametrosActivosPorCatalogoSistemaAdd(ConstantesCont.CatalogoParametro.CONTA_ESTADOS, com.brain.core.view.util.ConstantesCore.Parametro.TODOS);
    }

    public void setSiEstadosFiltro(List<ParametroDto> siEstadosFiltro) {
        this.siEstadosFiltro = siEstadosFiltro;
    }
    
    
    
}
